package com.kgcx.coupon.constant;

import com.kgcx.common.bean.ReturnData;
import com.kgcx.common.exception.BaseException;
import com.kgcx.common.exception.IErrors;

/**
 * 优惠价系统错误码
 *
 * @author panjin.
 * @date 2017/12/20.
 */
public enum CouponCode implements IErrors<ReturnData> {

    //10000-19999
    AD_NOT_EXISTS("10000", "广告不存在"),
    UNSUPPORTED_AD_PLACE("10001", "不支持的广告位"),
    AD_EFFECTIVE_START_TIME("10002", "有效期开始时间与广告名称为[%s]时间重叠"),
    AD_EFFECTIVE_END_TIME("10003", "有效期结束时间与广告名称为[%s]时间重叠"),


    BILLING_NOT_EXISTS("10010", "发票记录不存在"),
    BILLING_AMOUNT_LIMIT("10010", "申请发票金额大于订单金额");


    private String code;

    private String message;

    private CouponCode(String code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 采用枚举中定义的message作为返回信息
     *
     * @return
     */
    @Override
    public ReturnData parse() {
        return new ReturnData(code, message);
    }

    /**
     * 采用枚举中定义的message作为返回信息，并传递一些参数
     *
     * @param args 具体参数列表
     * @return
     */
    @Override
    public ReturnData parse(Object... args) {
        return null;
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为返回信息，并可能会带上一些参数
     *
     * @param message 错误信息
     * @param args    具体参数列表
     * @return
     */
    @Override
    public ReturnData parseMsg(String message, Object... args) {
        return null;
    }

    /**
     * 采用枚举中定义的message作为异常的信息
     *
     * @return
     */
    @Override
    public BaseException exp() {
        return new BaseException(code, message);
    }

    /**
     * 采用枚举中定义的message作为异常信息，并传递一些参数
     *
     * @param args 参数列表
     * @return
     */
    @Override
    public BaseException exp(Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, args);
    }

    /**
     * 采用枚举中定义的message作为异常信息，并传递一些参数，支持传入底层的异常
     *
     * @param cause 原始异常
     * @param args  参数列表
     * @return
     */
    @Override
    public BaseException exp(Throwable cause, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, cause, args);
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为异常信息，并可能会带上一些参数
     *
     * @param message 错误信息
     * @param args    具体参数列表
     * @return
     */
    @Override
    public BaseException expMsg(String message, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(formatReason, args);
    }

    /**
     * 采用枚举中定义的code，使用自定义的message作为异常信息，并可能会带上一些参数，并自持传入底层的异常
     *
     * @param message 错误信息
     * @param cause   原始异常
     * @param args    具体参数列表
     * @return
     */
    @Override
    public BaseException expMsg(String message, Throwable cause, Object... args) {
        String formatReason = String.format(message, args);
        return new BaseException(code, formatReason, cause, args);
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
